package ch02.LL_1_Parser;

import ch02.LL_1_Lexer.Lexer;
import ch02.LL_1_Lexer.ListLexer;

public class ListParser extends Parser{
    public ListParser(Lexer input) {
        super(input);
    }

    /** list : '[' elements ']' ; 匹配方括号 */
    public void list() {
        match(ListLexer.LBRACK);        // 期望匹配到 [
        elements();                     // 期望匹配到 elements
        match(ListLexer.RBRACK);        // 期望匹配到 ]
    }


    /** elements : element (',' element)* ; */
    void elements() {
        element();
        while (lookahead.type == ListLexer.COMMA) {
            match(ListLexer.COMMA);
            element();
        }
    }

    /** element : name | list ; // 一个element要么是NAME， 要么是嵌套的列表 */
    void element() {
        if (lookahead.type == ListLexer.NAME) {
            match(ListLexer.NAME);
        } else if (lookahead.type == ListLexer.LBRACK) {
            match(ListLexer.LBRACK);
        } else {
            throw new Error("expecting name or list; found " + lookahead);
        }
    }

}
